//package com.sq.imp.MyMenuManagers;
//
//import com.sq.abstractClass.MyMenu;
//import com.sq.abstractClass.Text;
//import com.sq.imp.Calculator.CalculatorWindow;
//import com.sq.imp.MainFrameImp;
//
//import javax.swing.*;
//import javax.swing.table.DefaultTableModel;
//import javax.swing.text.BadLocationException;
//import javax.swing.text.DefaultHighlighter;
//import javax.swing.text.Highlighter;
//import javax.swing.undo.UndoManager;
//import java.awt.*;
//import java.awt.event.ActionListener;
//import java.awt.event.KeyEvent;
//import java.awt.event.WindowEvent;
//import java.awt.event.WindowFocusListener;
//import java.io.*;
//import java.nio.channels.FileChannel;
//import java.nio.channels.FileLock;
//import java.sql.*;
//import java.util.ArrayList;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//import java.util.regex.PatternSyntaxException;
//
//public class MyMenuImp extends MyMenu {
//    private final Text textArea; // 用于显示文本内容
//    private final UndoManager undoManager; // 用于管理撤回和重做操作
//    private final JFrame frame;
//
//    private final Highlighter highlighter;
//    private final Highlighter.HighlightPainter painter;
//    private Pattern pattern;
//    private Matcher matcher;
//    private int lastMatchIndex;
//
//
//    private JTextField hostField, portField, dbNameField, userField, passwordField;
//    private String host, port, dbName, user, password;
//    private Connection connection;
//
//    private JTabbedPane resultTabbedPane; // 用于显示结果的选项卡
//
//    private FileChannel fileChannel;
//    private FileLock fileLock;
//
//    public MyMenuImp(MainFrameImp mainFrameImp, Text textArea) {
//        this.textArea = textArea;
//        this.highlighter = textArea.getHighlighter();
//        this.painter = new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
//        this.frame = mainFrameImp;
//        // 初始化UndoManager
//        undoManager = new UndoManager();
//        textArea.getDocument().addUndoableEditListener(undoManager);
//        textArea.addMouseWheelListener(e -> {
//            if (e.getWheelRotation() < 0 && e.isControlDown() && textArea.getFont().getSize() < 100) { // 滚轮向上，增大字体
//                textArea.setFont(new Font(textArea.getFont().getName(), textArea.getFont().getStyle(), textArea.getFont().getSize() + 5));
//            } else if (e.getWheelRotation() > 0 && e.isControlDown() && textArea.getFont().getSize() > 10){ // 滚轮向下，减小字体
//                textArea.setFont(new Font(textArea.getFont().getName(), textArea.getFont().getStyle(), textArea.getFont().getSize() - 5));
//            }
//        });
//
//        // 创建文件菜单
//        JMenu fileMenu = new JMenu("文件");
//        JMenuItem newFileItem = new JMenuItem("新建");
//        JMenuItem openFileItem = new JMenuItem("打开");
//        JMenuItem saveFileItem = new JMenuItem("保存");
//        JMenuItem exitItem = new JMenuItem("退出");
//
//        // 创建编辑菜单
//        JMenu editMenu = new JMenu("编辑");
//        JMenuItem copyItem = new JMenuItem("复制");
//        JMenuItem pasteItem = new JMenuItem("粘贴");
//        JMenuItem cutItem = new JMenuItem("剪切");
//        JMenuItem undoItem = new JMenuItem("撤回");
//        JMenuItem redoItem = new JMenuItem("重做");
//        JMenuItem findItem = new JMenuItem("查找");
//        JMenuItem replaceItem = new JMenuItem("替换");
//
//        JMenu menu = new JMenu("工具");
//        JMenuItem calculatorItem = new JMenuItem("自动计算器");
//
//        // 添加快捷键
//        saveFileItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_DOWN_MASK));
//        undoItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, KeyEvent.CTRL_DOWN_MASK));
//        redoItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, KeyEvent.CTRL_DOWN_MASK));
//        copyItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK));
//        pasteItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_DOWN_MASK));
//        cutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_DOWN_MASK));
//        findItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, KeyEvent.CTRL_DOWN_MASK));
//        replaceItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, KeyEvent.CTRL_DOWN_MASK));
//
//
//        // 添加菜单项到菜单
//        fileMenu.add(newFileItem);
//        fileMenu.add(openFileItem);
//        fileMenu.add(saveFileItem);
//        fileMenu.addSeparator();
//        fileMenu.add(exitItem);
//
//        editMenu.add(copyItem);
//        editMenu.add(pasteItem);
//        editMenu.add(cutItem);
//        editMenu.addSeparator();
//        editMenu.add(undoItem);
//        editMenu.add(redoItem);
//        editMenu.addSeparator();
//        editMenu.add(findItem);
//        editMenu.add(replaceItem);
//
//        calculatorItem.addActionListener(e -> openCalculator());
//        menu.add(calculatorItem);
//
//
//        // 添加菜单到菜单栏
//        this.add(fileMenu);
//        this.add(editMenu);
//        this.add(menu);
//
//        // 为菜单项添加事件监听器
//        newFileItem.addActionListener(e -> newFile());
//        openFileItem.addActionListener(e -> openFile());
//        saveFileItem.addActionListener(e -> saveFile());
//        exitItem.addActionListener(e -> exit());
//        copyItem.addActionListener(e -> copy());
//        pasteItem.addActionListener(e -> paste());
//        cutItem.addActionListener(e -> cut());
//        undoItem.addActionListener(e -> undo());
//        redoItem.addActionListener(e -> redo());
//        findItem.addActionListener(e -> showFindReplaceDialog(true));
//        replaceItem.addActionListener(e -> showFindReplaceDialog(false));
//
//        addStyle();
//
//
//        // 创建数据库菜单
//        JMenu dbMenu = new JMenu("数据库");
//        JMenuItem configItem = new JMenuItem("配置 MySQL 连接");
//        JMenuItem runAllItem = new JMenuItem("运行记事本文本命令");
//        JMenuItem runSelectedItem = new JMenuItem("运行记事本选中文本命令");
//        JMenuItem saveItem = new JMenuItem("保存 SQL 脚本");
//        JMenuItem loadItem = new JMenuItem("加载 SQL 脚本");
//
//        configItem.addActionListener(e -> showConfigWindow());
//        runAllItem.addActionListener(e -> runSQLCommands(textArea.getText()));
//        runSelectedItem.addActionListener(e -> {
//            String selectedText = textArea.getSelectedText();
//            if (selectedText != null) {
//                runSQLCommands(selectedText);
//            } else {
//                JOptionPane.showMessageDialog(this, "请先选择文本！", "错误", JOptionPane.ERROR_MESSAGE);
//            }
//        });
//        saveItem.addActionListener(e -> saveSQLScript());
//        loadItem.addActionListener(e -> loadSQLScript());
//
//        dbMenu.add(configItem);
//        dbMenu.add(runAllItem);
//        dbMenu.add(runSelectedItem);
//        dbMenu.add(saveItem);
//        dbMenu.add(loadItem);
//        menu.add(dbMenu);
//
//
//    }
//
//    private void showConfigWindow() {
//        // 创建配置窗口
//        JDialog configDialog = new JDialog(frame, "配置 MySQL 连接", true);
//        configDialog.setSize(300, 250);
//        configDialog.setLayout(new GridLayout(6, 2, 10,
//                10));
//
//        // 添加输入字段
//        configDialog.add(new JLabel("主机:"));
//        hostField = new JTextField("localhost"); // 默认值
//        configDialog.add(hostField);
//
//        configDialog.add(new JLabel("端口:"));
//        portField = new JTextField("3306"); // 默认值
//        configDialog.add(portField);
//
//        configDialog.add(new JLabel("数据库:"));
//        dbNameField = new JTextField("mysql"); // 默认值
//        configDialog.add(dbNameField);
//
//        configDialog.add(new JLabel("用户名:"));
//        userField = new JTextField("root"); // 默认值
//        configDialog.add(userField);
//
//        configDialog.add(new JLabel("密码:"));
//        passwordField = new JTextField("root"); // 默认值
//        configDialog.add(passwordField);
//
//        // 添加按钮
//        JButton connectButton = new JButton("连接");
//        connectButton.addActionListener(e -> {
//            host = hostField.getText();
//            port = portField.getText();
//            dbName = dbNameField.getText();
//            user = userField.getText();
//            password = passwordField.getText();
//
//            try {
//                // 测试连接
//                connection = DriverManager.getConnection(
//                        "jdbc:mysql://" + host + ":" + port + "/" + dbName, user, password);
//                JOptionPane.showMessageDialog(this, "连接成功！");
//                configDialog.dispose();
//            } catch (SQLException ex) {
//                JOptionPane.showMessageDialog(this, "连接失败：" + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
//            }
//        });
//        configDialog.add(connectButton);
//
//        JButton resetConnectButton = new JButton("重置连接");
//        resetConnectButton.addActionListener(e -> {
//            resetConnection();
//        });
//        configDialog.add(resetConnectButton);
//
//        configDialog.setVisible(true);
//    }
//
//    private void resetConnection() {
//        if (connection != null) {
//            try {
//                connection.close();
//                connection = null;
//                JOptionPane.showMessageDialog(this, "连接已重置！", "成功", JOptionPane.INFORMATION_MESSAGE);
//            } catch (SQLException ex) {
//                JOptionPane.showMessageDialog(this, "重置连接失败：" + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
//            }
//        } else {
//            JOptionPane.showMessageDialog(this, "当前没有活动的连接！", "提示", JOptionPane.INFORMATION_MESSAGE);
//        }
//    }
//
//    private void runSQLCommands(String sql) {
//        if (connection == null) {
//            JOptionPane.showMessageDialog(this, "请先配置 MySQL 连接！", "错误", JOptionPane.ERROR_MESSAGE);
//            return;
//        }
//
//        // 用于显示结果的独立窗口
//        JFrame resultWindow = null;
//
//        try (Statement statement = connection.createStatement()) {
//            // 分割命令，支持以分号结尾的命令
//            String[] commands = sql.split(";");
//            for (String command : commands) {
//                command = command.trim();
//                if (command.isEmpty()) continue;
//
//                // 特殊命令（如 USE）可以不带分号
//                if (command.toUpperCase().startsWith("USE ")) {
//                    statement.execute(command);
//                    showTextResult("数据库切换成功：" + command, command);
//                } else {
//                    try {
//                        boolean isQuery = command.toLowerCase().startsWith("select") || command.toLowerCase().startsWith("show");
//                        if (resultWindow == null) {
//                            resultWindow = new JFrame("执行结果");
//                            resultWindow.setSize(800, 600);
//                            resultWindow.setLayout(new BorderLayout());
//                            resultTabbedPane = new JTabbedPane();
//                            resultWindow.add(resultTabbedPane, BorderLayout.CENTER);
//                            resultWindow.setVisible(true);
//                        }
//                        if (isQuery) {
//                            ResultSet resultSet = statement.executeQuery(command);
//                            showResultSet(resultSet, command);
//                        } else {
//                            int rowsAffected = statement.executeUpdate(command);
//                            showTextResult("操作成功！受影响的行数：" + rowsAffected, command);
//                        }
//                    } catch (SQLException ex) {
//                        showTextResult("执行失败：" + ex.getMessage(), command);
//                    }
//                }
//            }
//        } catch (SQLException ex) {
//            showTextResult("执行失败：" + ex.getMessage(), sql);
//        }
//    }
//
//    private void showResultSet(ResultSet resultSet, String sql) throws SQLException {
//
//        ResultSetMetaData metaData = resultSet.getMetaData();
//        int columnCount = metaData.getColumnCount();
//        String[] columnNames = new String[columnCount];
//        for (int i = 1; i <= columnCount; i++) {
//            columnNames[i - 1] = metaData.getColumnName(i);
//        }
//
//        DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0);
//        while (resultSet.next()) {
//            Object[] row = new Object[columnCount];
//            for (int i = 1; i <= columnCount; i++) {
//                row[i - 1] = resultSet.getObject(i);
//            }
//            tableModel.addRow(row);
//        }
//
//        JTable table = new JTable(tableModel);
//        JScrollPane scrollPane = new JScrollPane(table);
//        resultTabbedPane.addTab("查询结果 - " + sql.substring(0, Math.min(sql.length(), 30)), scrollPane);
//    }
//
//    private void showTextResult(String result, String sql) {
//
//        JTextArea textArea = new JTextArea(result);
//        textArea.setEditable(false);
//        JScrollPane scrollPane = new JScrollPane(textArea);
//        resultTabbedPane.addTab("执行结果 - " + sql.substring(0, Math.min(sql.length(), 30)), scrollPane);
//    }
//
//
//    private void saveSQLScript() {
//        // 设置Windows风格
//        try {
//            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        JFileChooser fileChooser = new JFileChooser();
//        int result = fileChooser.showSaveDialog(this);
//        if (result == JFileChooser.APPROVE_OPTION) {
//            try {
//                java.nio.file.Files.write(fileChooser.getSelectedFile().toPath(), textArea.getText().getBytes());
//                JOptionPane.showMessageDialog(this, "脚本已保存！", "成功", JOptionPane.INFORMATION_MESSAGE);
//            } catch (Exception e) {
//                JOptionPane.showMessageDialog(this, "保存失败：" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
//            }
//        }
//    }
//
//    private void loadSQLScript() {
//        try {
//            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        JFileChooser fileChooser = new JFileChooser();
//        // 设置Windows风格
//        int result = fileChooser.showOpenDialog(this);
//        if (result == JFileChooser.APPROVE_OPTION) {
//            try {
//                String content = new String(java.nio.file.Files.readAllBytes(fileChooser.getSelectedFile().toPath()));
//                textArea.setText(content);
//                JOptionPane.showMessageDialog(this, "脚本已加载！", "成功", JOptionPane.INFORMATION_MESSAGE);
//            } catch (Exception e) {
//                JOptionPane.showMessageDialog(this, "加载失败：" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
//            }
//        }
//    }
//
//
//    private void showFindReplaceDialog(boolean isFind) {
//        final JDialog dialog = new JDialog(frame, isFind ? "查找" : "替换", false);
//        dialog.setSize(400, isFind ? 300 : 350);
//        dialog.setLayout(new GridBagLayout());
//        GridBagConstraints gbc = new GridBagConstraints();
//        gbc.insets = new Insets(5, 5, 5, 5);
//
//
//        dialog.addWindowFocusListener(new WindowFocusListener() {
//            @Override
//            public void windowGainedFocus(WindowEvent e) {
//                // 窗口获得焦点时不做任何操作
//            }
//
//            @Override
//            public void windowLostFocus(WindowEvent e) {
//                // 窗口失去焦点时关闭窗口
//                dialog.dispose();
//            }
//        });
//
//        final JTextField findField = new JTextField(20);
//        final JTextField replaceField = isFind ? null : new JTextField(20);
//        final JCheckBox caseSensitiveBox = new JCheckBox("区分大小写");
//        final JCheckBox regexBox = new JCheckBox("使用正则表达式");
//        final JCheckBox highlightAllBox = new JCheckBox("下一次高亮显示所有匹配项");
//        JButton findNextButton = isFind ? new JButton("查找下一个") : null;
//        JButton replaceNextButton = isFind ? null : new JButton("替换下一个");
//        JButton replaceAllButton = isFind ? null : new JButton("替换所有");
//        JButton clearHighlightsButton = new JButton("清除高亮");
//        gbc.gridx = 0;
//        gbc.gridy = 0;
//        gbc.anchor = GridBagConstraints.EAST;
//        dialog.add(new JLabel("查找："), gbc);
//
//        gbc.gridx = 1;
//        gbc.anchor = GridBagConstraints.WEST;
//        dialog.add(findField, gbc);
//
//        if (!isFind) {
//            gbc.gridy++;
//            gbc.anchor = GridBagConstraints.EAST;
//            dialog.add(new JLabel("替换为："), gbc);
//
//            gbc.anchor = GridBagConstraints.WEST;
//            dialog.add(replaceField, gbc);
//        }
//
//        gbc.gridy++;
//        gbc.gridwidth = 2;
//        gbc.anchor = GridBagConstraints.WEST;
//        dialog.add(caseSensitiveBox, gbc);
//
//        gbc.gridy++;
//        dialog.add(regexBox, gbc);
//
//        gbc.gridy++;
//        dialog.add(highlightAllBox, gbc);
//
//        gbc.gridy++;
//        gbc.gridwidth = 1;
//        gbc.anchor = GridBagConstraints.CENTER;
//        if (isFind) {
//            dialog.add(findNextButton, gbc);
//        } else {
//            dialog.add(replaceNextButton, gbc);
//        }
//        gbc.gridy++;
//        gbc.gridx = 1;
//        if (isFind) {
//            dialog.add(clearHighlightsButton, gbc);
//        } else {
//            dialog.add(replaceAllButton, gbc);
//        }
//
//        gbc.gridy++;
//        gbc.gridx = 0;
//        gbc.gridwidth = 2;
//
//        ActionListener findAction = e -> performFind(findField.getText(), caseSensitiveBox.isSelected(), regexBox.isSelected(), highlightAllBox.isSelected());
//        ActionListener replaceNextAction = e -> performReplaceNext(findField.getText(), replaceField.getText(), caseSensitiveBox.isSelected(), regexBox.isSelected());
//        ActionListener replaceAllAction = e -> performReplaceAll(findField.getText(), replaceField.getText(), caseSensitiveBox.isSelected(), regexBox.isSelected());
//        ActionListener clearHighlightsAction = e -> textArea.getHighlighter().removeAllHighlights();
//
//        if (isFind) {
//            findNextButton.addActionListener(findAction);
//        } else {
//            replaceNextButton.addActionListener(replaceNextAction);
//            replaceAllButton.addActionListener(replaceAllAction);
//        }
//        clearHighlightsButton.addActionListener(clearHighlightsAction);
//        dialog.setVisible(true);
//    }
//
//    private void performFind(String findStr, boolean caseSensitive, boolean useRegex, boolean highlightAll) {
//        if (findStr == null || findStr.isEmpty()) {
//            JOptionPane.showMessageDialog(this, "请输入查找内容！", "错误", JOptionPane.ERROR_MESSAGE);
//            return;
//        }
//
//        try {
//            int flags = caseSensitive ? 0 : Pattern.CASE_INSENSITIVE;
//            pattern = useRegex ? Pattern.compile(findStr, flags) : Pattern.compile(Pattern.quote(findStr), flags);
//            matcher = pattern.matcher(textArea.getText());
//            if (matcher.find(lastMatchIndex)) {
//                int start = matcher.start();
//                int end = matcher.end();
//                textArea.setCaretPosition(start);
//                textArea.moveCaretPosition(end);
//                lastMatchIndex = end;
//
//                if (highlightAll) {
//                    highlightAllMatches(findStr, caseSensitive, useRegex);
//                } else {
//                    textArea.getHighlighter().removeAllHighlights();
//                    highlighter.addHighlight(start, end, painter);
//                }
//            } else {
//                JOptionPane.showMessageDialog(this, "未找到更多匹配项！", "查找结果", JOptionPane.INFORMATION_MESSAGE);
//                lastMatchIndex = 0;
//            }
//        } catch (PatternSyntaxException e) {
//            JOptionPane.showMessageDialog(this, "无效的正则表达式！", "错误", JOptionPane.ERROR_MESSAGE);
//        } catch (BadLocationException e) {
//            throw new RuntimeException(e);
//        }
//    }
//
//    private void highlightAllMatches(String findStr, boolean caseSensitive, boolean useRegex) {
//        textArea.getHighlighter().removeAllHighlights();
//        try {
//            int flags = caseSensitive ? 0 : Pattern.CASE_INSENSITIVE;
//            pattern = useRegex ? Pattern.compile(findStr, flags) : Pattern.compile(Pattern.quote(findStr), flags);
//            matcher = pattern.matcher(textArea.getText());
//            while (matcher.find()) {
//                highlighter.addHighlight(matcher.start(), matcher.end(), painter);
//            }
//        } catch (PatternSyntaxException | BadLocationException e) {
//            JOptionPane.showMessageDialog(this, "无效的正则表达式！", "错误", JOptionPane.ERROR_MESSAGE);
//        }
//    }
//
//    private void performReplaceNext(String findStr, String replaceStr, boolean caseSensitive, boolean useRegex) {
//        if (findStr == null || findStr.isEmpty()) {
//            JOptionPane.showMessageDialog(this, "请输入查找内容！", "错误", JOptionPane.ERROR_MESSAGE);
//            return;
//        }
//
//        if (replaceStr == null || replaceStr.isEmpty()) {
//            JOptionPane.showMessageDialog(this, "请输入替换内容！", "错误", JOptionPane.ERROR_MESSAGE);
//            return;
//        }
//
//        try {
//            int flags = caseSensitive ? 0 : Pattern.CASE_INSENSITIVE;
//            pattern = useRegex ? Pattern.compile(findStr, flags) : Pattern.compile(Pattern.quote(findStr), flags);
//            matcher = pattern.matcher(textArea.getText());
//            if (matcher.find(lastMatchIndex)) {
//                int start = matcher.start();
//                int end = matcher.end();
//                String newContent = textArea.getText().substring(0, start) + replaceStr + textArea.getText().substring(end);
//                textArea.setText(newContent);
//                lastMatchIndex = start + replaceStr.length();
//                textArea.getHighlighter().removeAllHighlights();
//                highlighter.addHighlight(start, lastMatchIndex, painter);
//            } else {
//                JOptionPane.showMessageDialog(this, "未找到更多匹配项！", "替换结果", JOptionPane.INFORMATION_MESSAGE);
//                lastMatchIndex = 0;
//            }
//        } catch (PatternSyntaxException | BadLocationException e) {
//            JOptionPane.showMessageDialog(this, "无效的正则表达式！", "错误", JOptionPane.ERROR_MESSAGE);
//        }
//    }
//
//    private void performReplaceAll(String findStr, String replaceStr, boolean caseSensitive, boolean useRegex) {
//        if (findStr == null || findStr.isEmpty()) {
//            JOptionPane.showMessageDialog(this, "请输入查找内容！", "错误", JOptionPane.ERROR_MESSAGE);
//            return;
//        }
//
//        if (replaceStr == null || replaceStr.isEmpty()) {
//            JOptionPane.showMessageDialog(this, "请输入替换内容！", "错误", JOptionPane.ERROR_MESSAGE);
//            return;
//        }
//
//        try {
//            int flags = caseSensitive ? 0 : Pattern.CASE_INSENSITIVE;
//            pattern = useRegex ? Pattern.compile(findStr, flags) : Pattern.compile(Pattern.quote(findStr), flags);
//            String newContent = pattern.matcher(textArea.getText()).replaceAll(replaceStr);
//            textArea.setText(newContent);
//            textArea.getHighlighter().removeAllHighlights();
//            lastMatchIndex = 0;
//        } catch (PatternSyntaxException e) {
//            JOptionPane.showMessageDialog(this, "无效的正则表达式！", "错误", JOptionPane.ERROR_MESSAGE);
//        }
//    }
//
//    private void openCalculator() {
//        String selectedText = textArea.getSelectedText();
//
//        if (selectedText == null || selectedText.isEmpty()) {
////            JOptionPane.showMessageDialog(this, "请先选中一段文本", "提示", JOptionPane.INFORMATION_MESSAGE);
//
//        }
//        else if (!isMathExpression(selectedText)) {
//            JOptionPane.showMessageDialog(this, "选中的文本不是有效的数学表达式", "提示", JOptionPane.INFORMATION_MESSAGE);
//            return;
//        }
//
//        // 获取当前鼠标位置
//        Point mouseLocation = MouseInfo.getPointerInfo().getLocation();
//        new CalculatorWindow(selectedText, mouseLocation).setVisible(true);
//    }
//
//    private boolean isMathExpression(String text) {
//        // 简单的正则表达式，匹配包含数字和运算符的字符串
//        return text.matches("[\\d+\\-*/%^().!\\s]+");
//    }
//
//    private void showCustomDialog(String message, String title) {
//        // 获取鼠标位置
//        Point mouseLocation = MouseInfo.getPointerInfo().getLocation();
//
//        // 创建自定义对话框
//        JDialog dialog = new JDialog(frame, "提示", true);
//        dialog.setLayout(new BorderLayout());
//        dialog.add(new JLabel(message, SwingConstants.CENTER), BorderLayout.CENTER);
//        JButton okButton = new JButton("确定");
//        okButton.addActionListener(e -> dialog.dispose());
//        dialog.add(okButton, BorderLayout.SOUTH);
//        dialog.pack();
//
//        // 设置对话框位置为鼠标位置
//        dialog.setLocation(mouseLocation.x, mouseLocation.y);
//
//        // 显示对话框
//        dialog.setVisible(true);
//    }
//
//    @Override
//    public void newFile() {
//        if (fileLock != null) {
//            try {
//                fileLock.release(); // 解锁文件
//                fileLock = null;
//                fileChannel.close();
//                fileChannel = null;
//                textArea.setText(""); // 清空文本区域
//                JOptionPane.showMessageDialog(this, "文件已解锁，可以创建新文件！", "提示", JOptionPane.INFORMATION_MESSAGE);
//            } catch (IOException e) {
//                JOptionPane.showMessageDialog(this, "解锁文件失败：" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
//            }
//        } else {
//            textArea.setText(""); // 清空文本区域
//        }
//        textArea.setFile(null);
//        textArea.setEncoding("");
//    }
//
//    @Override
//    public void openFile() {
//        ArrayList<File> file = new ArrayList<>();
//        ArrayList<String> encoding = new ArrayList<>();
//        selectFileAndEncoding(textArea, file, encoding);
//        if (file.isEmpty() || encoding.isEmpty()) {
//            System.out.println("文件未选择成功或编码未选择成功");
//            return;
//        }
//        try (RandomAccessFile raf = new RandomAccessFile(file.get(0), "rw")) {
//            FileInputStream fis = new FileInputStream(file.get(0));
//            InputStreamReader isr = new InputStreamReader(fis, encoding.get(0));
//            BufferedReader bufferedReader = new BufferedReader(isr);
//            // 读取文件内容到 JTextArea
//            textArea.read(bufferedReader, null);
//            bufferedReader.close(); // 关闭流
//            textArea.setFile(file.get(0));
//            textArea.setEncoding(encoding.get(0));
//            fileChannel = raf.getChannel();
//            fileLock = fileChannel.lock(); // 锁定文件
//        } catch (IOException e) {
//            JOptionPane.showMessageDialog(this, "打开文件失败：" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
//        }
//    }
//
//    @Override
//    public void saveFile() {
//        if(textArea.getFile() == null || textArea.getEncoding() == null) {
//            ArrayList<File> file = new ArrayList<>();
//            ArrayList<String> encoding = new ArrayList<>();
//            selectFileAndEncoding(textArea, file, encoding);
//            if (file.isEmpty() || encoding.isEmpty()) {
//                System.out.println("文件未选择成功或编码未选择成功");
//                return;
//            } else {
//                textArea.setFile(file.get(0));
//                textArea.setEncoding(encoding.get(0));
//            }
//        }
//        try{
//            FileOutputStream fos = new FileOutputStream(textArea.getFile());
//            OutputStreamWriter osr = new OutputStreamWriter(fos, textArea.getEncoding());
//            BufferedWriter bw = new BufferedWriter(osr);
//            textArea.write(bw);
//            bw.close();
//        } catch (FileNotFoundException e) {
//            JOptionPane.showMessageDialog(textArea, "文件未找到！", "错误", JOptionPane.ERROR_MESSAGE);
//        } catch (IOException e) {
//            JOptionPane.showMessageDialog(textArea, "读取文件时发生错误！", "错误", JOptionPane.ERROR_MESSAGE);
//        }
//    }
//
//    @Override
//    public void exit() {
//        System.exit(0); // 退出程序
//    }
//
//    @Override
//    public void copy() {
//        textArea.copy(); // 调用JTextArea的复制功能
//    }
//
//    @Override
//    public void paste() {
//        textArea.paste(); // 调用JTextArea的粘贴功能
//    }
//
//    @Override
//    public void cut() {
//        textArea.cut(); // 调用JTextArea的剪切功能
//    }
//
//    @Override
//    public void undo() {
//        if (undoManager.canUndo()) {
//            undoManager.undo();
//        } else {
//            JOptionPane.showMessageDialog(null, "没有可撤回的操作", "提示", JOptionPane.INFORMATION_MESSAGE);
//        }
//    }
//
//    @Override
//    public void redo() {
//        if (undoManager.canRedo()) {
//            undoManager.redo();
//        } else {
//            JOptionPane.showMessageDialog(null, "没有可重做的操作", "提示", JOptionPane.INFORMATION_MESSAGE);
//        }
//    }
//
//    public static void selectFileAndEncoding(Component parent, ArrayList<File> file, ArrayList<String> encoding) {
//        if (!file.isEmpty() || !encoding.isEmpty()) {
//            System.out.println("file and encoding must is empty");
//            return;
//        }
//        // 设置Windows风格
//        try {
//            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        // 创建文件选择器
//        JFileChooser fileChooser = new JFileChooser();
//        int result = fileChooser.showOpenDialog(parent); // 显示文件选择对话框
//        if (result == JFileChooser.APPROVE_OPTION) { // 检查用户是否选择了文件
//            file.add(fileChooser.getSelectedFile());
//
//            // 提供编码类型选择
//            String[] encodingOptions = {"UTF-8", "GBK", "ISO-8859-1", "UTF-16", "Windows-1252", "Other"};
//            String selectedEncoding = (String) JOptionPane.showInputDialog(
//                    parent,
//                    "Select the file encoding:",
//                    "Encoding Selection",
//                    JOptionPane.QUESTION_MESSAGE,
//                    null,
//                    encodingOptions,
//                    encodingOptions[0]); // 默认选择UTF-8
//
//            // 检查用户是否选择了编码类型
//            if (selectedEncoding != null) {
//                // 如果用户选择了“Other”，提示用户输入自定义编码
//                if ("Other".equals(selectedEncoding)) {
//                    selectedEncoding = JOptionPane.showInputDialog(parent, "Enter custom encoding:");
//                    if (selectedEncoding == null || selectedEncoding.trim().isEmpty()) {
////                        JOptionPane.showMessageDialog(parent, "No custom encoding provided.", "Error", JOptionPane.ERROR_MESSAGE);
//                        System.out.println("No custom encoding provided");
//                    }
//                }
//                if (selectedEncoding != null) {
//                    encoding.add(selectedEncoding);
//                }
//            } else {
////                JOptionPane.showMessageDialog(parent, "No encoding selected.", "Error", JOptionPane.ERROR_MESSAGE);
//                System.out.println("No encoding selected");
//            }
//        } else {
////            JOptionPane.showMessageDialog(parent, "No file selected.", "Error", JOptionPane.ERROR_MESSAGE);
//            System.out.println("No file selected");
//        }
//    }
//
//    private void toggleFontStyle(int fontStyle) {
//        Font currentFont = textArea.getFont();
//        int newStyle = currentFont.getStyle() ^ fontStyle; // 切换样式
//        textArea.setFont(currentFont.deriveFont(newStyle));
//    }
//
//    private void addStyle() {
//        // 字体样式和颜色菜单
//        JMenu fontAndColorMenu = new JMenu("字体样式与颜色");
//        add(fontAndColorMenu);
//
//        // 字体样式子菜单
//        JMenu fontStyleMenu = new JMenu("字体样式");
//        fontAndColorMenu.add(fontStyleMenu);
//
//        JMenuItem boldItem = new JMenuItem("加粗");
//        boldItem.addActionListener(e -> toggleFontStyle(Font.BOLD));
//        fontStyleMenu.add(boldItem);
//
//        JMenuItem italicItem = new JMenuItem("斜体");
//        italicItem.addActionListener(e -> toggleFontStyle(Font.ITALIC));
//        fontStyleMenu.add(italicItem);
//
//        // 字体颜色子菜单
//        JMenu fontColorMenu = new JMenu("字体颜色");
//        fontAndColorMenu.add(fontColorMenu);
//
//        JMenuItem colorBlackItem = new JMenuItem("黑色");
//        colorBlackItem.addActionListener(e -> textArea.setForeground(Color.RED));
//        fontColorMenu.add(colorBlackItem);
//
//        JMenuItem colorRedItem = new JMenuItem("红色");
//        colorRedItem.addActionListener(e -> textArea.setForeground(Color.RED));
//        fontColorMenu.add(colorRedItem);
//
//        JMenuItem colorBlueItem = new JMenuItem("蓝色");
//        colorBlueItem.addActionListener(e -> textArea.setForeground(Color.BLUE));
//        fontColorMenu.add(colorBlueItem);
//
//
//        JMenuItem colorGreenItem = new JMenuItem("绿色");
//        colorGreenItem.addActionListener(e -> textArea.setForeground(Color.GREEN));
//        fontColorMenu.add(colorGreenItem);
//
//        // 自定义颜色菜单项
//        JMenuItem customColorItem = new JMenuItem("自定义颜色");
//        customColorItem.addActionListener(e -> {
//            Color initialColor = textArea.getForeground(); // 获取当前文本颜色
//            Color newColor = JColorChooser.showDialog(this, "选择文本颜色", initialColor);
//            if (newColor != null) { // 如果用户选择了颜色
//                textArea.setForeground(newColor);
//            }
//        });
//        fontColorMenu.add(customColorItem);
//
//    }
//}